
//
//  WBComposeTextView.swift
//  SinaWebo
//
//  Created by 亚杏 on 2017/6/12.
//  Copyright © 2017年 oms. All rights reserved.
//

import UIKit

// 撰写微博文本视图
class WBComposeTextView: UITextView {

    //占位标签
    private lazy var placeholderLabel = UILabel()

    override func awakeFromNib() {
        setupUI()
    }

   func setupUI() {

    //1.设置占位标签
    placeholderLabel.text = "分享新鲜事..."
    placeholderLabel.font = self.font
    placeholderLabel.textColor = UIColor.lightGray
    placeholderLabel.frame.origin = CGPoint(x: 5, y: 8)
    placeholderLabel.sizeToFit()

    addSubview(placeholderLabel)

    //注册通知
    NotificationCenter.default.addObserver(self, selector: #selector(textChanged), name: NSNotification.Name.UITextViewTextDidChange, object: self)

    }

    deinit {
        NotificationCenter.default.removeObserver(self)
    }

    @objc func textChanged() {

        //如果有文本，不显示占位标签，否则显示
        placeholderLabel.isHidden = self.hasText
    }

}

extension WBComposeTextView {
    //返回的textView对应的属性文本转换成文字
    var emoticonText: String {

        guard let attrStr = attributedText else {
            return ""
        }

        //2.需要获得属性文本中的图片[附件： Attachment]
        var result = String()
        let range = NSRange(location: 0, length: attrStr.length)
        attrStr.enumerateAttributes(in: range, options: [], using: { (dict, range, _) in
            //            print(dict)
            //            print(range)
            //如果字典中包含NSAttachment，说明是图片，否则是文本
            if let attachment = dict["NSAttachment"] as? XYXEmoticonAttachment {
                //从attachment里获得chs
                result += attachment.chs ?? ""
                print("图片\(attachment)")
            } else {
                let subStr = (attrStr.string as NSString).substring(with: range)
                result += subStr
            }

        })
        
        return result
        
    }
    

}

//MARK: 表情键盘专属方法
extension WBComposeTextView {
    /// 向文本视图插入表情符号,图文混排
    /// - Parameter em: 选中的表情符号， nil表示删除
    /// 所有排版系统中，都有一个共同特点，插入的字条的显示，跟随前一个字符的属性，但本身没有’属性’
    func insertEmoticon(em: XYXEmoticonModel?) {

        //1. em == nil 是删除按钮
        guard em != nil else {
            // 删除文本
            deleteBackward()
            return
        }

        //2. emoji 是字符串
        if let emoji = em?.emoji,
            let textRange = selectedTextRange {

            //UITextRange 仅用在此处
            replace(textRange, withText: emoji)
        }

        //3.代码执行到此都是图片表情
        //0> 表情的图像属性文本
        //        let imageText = NSMutableAttributedString(attributedString: (em?.imageText(font: .font!))!)
        //        //设置图像文字的属性
        //        imageText.addAttributes([NSFontAttributeName: .font!], range: NSRange(location: 0, length: 1))
        //
        //
        //1> 获取 当前的属性文本 ，可变的
        let attrStrM = NSMutableAttributedString(attributedString:attributedText)
        let imageText = em?.imageText(font: font!)

        //2> 将图像属性文本插入当前光标位置
        attrStrM.replaceCharacters(in: selectedRange, with: imageText!)

        //3> 重新设置属性文本
        //记录光标位置
        let range = selectedRange

        attributedText = attrStrM

        //恢复光标位置,length是选中字符的长度，插入文本后，应该为0
        selectedRange = NSRange(location: range.location + 1, length: 0)

        // 让代理执行文本变化方法 - 在需要时通知代理执行协议方法
        delegate?.textViewDidChange?(self)

        //执行当前对象的文本变化方法
        textChanged()
    }
    
}

